package br.com.vpsa.previdordevendas.model.entity;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Calendar;
import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Transient;

import br.com.vpsa.previdordevendas.model.pojo.EntidadePojo;
import br.com.vpsa.previdordevendas.model.util.CalendarUtils;
import br.com.vpsa.previdordevendas.model.util.MoedaUtil;

@Entity
public class Investimento {

    @Id
    @GeneratedValue
	private Long id;
    
    private String nome;
    
    private String base;
    
    private Long idEntidade;
    
    @Transient
    private EntidadePojo entidade;
    
    private BigDecimal valor;
    
    private Integer depreciacaoAnual;
    
    private Date dataInvestimento;
    
    private Integer mesesPayBack;
    
    private Integer mesesTotaisInvestimento;
    
    private BigDecimal rendimentoPrimeiroMes;
        
    public BigDecimal getDepreciacaoPercentualMensal()
    {
    	BigDecimal depreciacaoMensal = new BigDecimal(depreciacaoAnual).divide( new BigDecimal(12), 2, RoundingMode.HALF_EVEN );
    	
    	return depreciacaoMensal.divide( new BigDecimal(100), 2, RoundingMode.HALF_EVEN );
    }
    
    public BigDecimal getValorMes( int mes )
    {
    	BigDecimal result;
    	
    	if( depreciacaoAnual != null && depreciacaoAnual > 0 )
    	{
    		if( mes == 0 ){
    			result = rendimentoPrimeiroMes;
    		}
    		else {		
    			result = rendimentoPrimeiroMes.multiply( BigDecimal.ONE.subtract( getDepreciacaoPercentualMensal() ).pow(mes) );
    			result = result.setScale(2, RoundingMode.HALF_EVEN);
    		}
    	}
    	else {
    		result = valor.divide( new BigDecimal(mesesPayBack), 2, RoundingMode.HALF_EVEN);
    	}
    	
    	return result;    	
    }
    
    public Calendar getDataFimInvestimento(){
    	
    	Calendar dataFimInvestimento = CalendarUtils.getCalendar(dataInvestimento);
    	dataFimInvestimento.add(Calendar.MONTH, mesesTotaisInvestimento-1);
    	dataFimInvestimento.set(Calendar.DAY_OF_MONTH , dataFimInvestimento.getActualMaximum(Calendar.DAY_OF_MONTH) );
    	
    	return dataFimInvestimento;
    }
    
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getBase() {
		return base;
	}

	public void setBase(String base) {
		this.base = base;
	}

	public BigDecimal getValor() {
		return valor;
	}
	
	public String getValorFormatado() {
		return MoedaUtil.convert(valor);
	}

	public void setValor(BigDecimal valor) {
		this.valor = valor;
	}

	public Date getDataInvestimento() {
		return dataInvestimento;
	}
	
	public String getDataInvestimentoFormatada() {
		return CalendarUtils.MES_ANO_FORMAT.format(dataInvestimento);
	}
	
	public void setDataInvestimento(Date dataInvestimento) {
		this.dataInvestimento = dataInvestimento;
	}

	public Integer getMesesPayBack() {
		return mesesPayBack;
	}

	public void setMesesPayBack(Integer mesesPayBack) {
		this.mesesPayBack = mesesPayBack;
	}

	public Integer getMesesTotaisInvestimento() {
		return mesesTotaisInvestimento;
	}

	public void setMesesTotaisInvestimento(Integer mesesTotaisInvestimento) {
		this.mesesTotaisInvestimento = mesesTotaisInvestimento;
	}

	public Long getIdEntidade() {
		return idEntidade;
	}

	public void setIdEntidade(Long idEntidade) {
		this.idEntidade = idEntidade;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public EntidadePojo getEntidade() {
		return entidade;
	}

	public void setEntidade(EntidadePojo entidade) {
		this.entidade = entidade;
	}

	public Integer getDepreciacaoAnual() {
		return depreciacaoAnual;
	}

	public String getDepreciacaoAnualFormatada() {
		return depreciacaoAnual != null ? depreciacaoAnual+" %" : "";
	}
	
	public void setDepreciacaoAnual(Integer depreciacaoMensal) {
		this.depreciacaoAnual = depreciacaoMensal;
	}
	
	public void setRendimentoPrimeiroMes(BigDecimal rendimentoPrimeiroMes) {
		this.rendimentoPrimeiroMes = rendimentoPrimeiroMes;
	}

	public BigDecimal getRendimentoPrimeiroMes() {
		return rendimentoPrimeiroMes;
	}

}
